package Day021_反射_注解.demo6_反射之操作成员变量;

import java.lang.reflect.Field;

/**
 * @Author：pengzhilin
 * @Date: 2020/5/14 11:58
 */
public class Test2 {
    public static void main(String[] args) throws Exception {
        /*
               通过反射获取类的成员变量
                        Field getDeclaredField(String name);获取单个任意修饰符修饰的成员变量
                            参数:成员变量名  字符串类型
                        Field[] getDeclaredFields();获取所有的成员变量

               通过反射访问成员变量:
                Field对象常用方法
                    为成员变量设置值的方法
                        void  set(Object obj, Object value)    记住
                        参数1: 要赋值属性的对象
                        参数2: 属性具体的值

                    获取成员变量值的方法
                        Object get(Object obj)      记住
                        参数: 要获取属性值的对象
                        返回值: 属性具体的值

                    void setAccessible(true);暴力反射，设置为可以直接访问私有类型的属性。  记住

                    Class getType(); 获取属性的类型，返回Class对象。
         */
        // 通过反射获取类的成员变量
        // 1.获取Student类的Class对象
        Class<?> c = Class.forName("com.itheima.demo6_反射之操作成员变量.Student");

        // 2. 获取单个成员变量的Field对象
        // 2.1 获取单个public修饰的成员变量
        Field nameF = c.getDeclaredField("name");
        // 2.2 通过反射为name属性赋值
        Student stu = new Student();
        nameF.set(stu,"张三");

        Field ageF = c.getDeclaredField("age");
        // ageF.set(stu,18);
        ageF.setInt(stu,19);

        System.out.println(stu);// Student{name='张三', age=18, sex='null'}

        // 2.3 获取某个属性的值
        System.out.println(nameF.get(stu));// 张三
        System.out.println(ageF.get(stu));// 19

        // 2.2 获取单个private修饰的成员变量
        Field sexF = c.getDeclaredField("sex");
        // 暴力反射
        sexF.setAccessible(true);
        sexF.set(stu,"李四");

        // 获取
        System.out.println(sexF.get(stu));// 李四


        // 获取nameF属性的类型
        Class<?> c1 = nameF.getType();
        System.out.println(c1);// class java.lang.String


    }
}
